﻿using System.Collections.Generic;
using UnityEngine;

// 有限状态机类
public class FSM : MonoBehaviour
{
    private IState currentState;        // 当前状态接口
    protected Dictionary<StateType, IState> states = new Dictionary<StateType, IState>();  // 状态字典，存储各种状态

    public Parameter parameter;     // 状态机参数

    protected virtual void Awake() { 
        // 初始化各个状态，并添加到状态字典中
        // states.Add(StateType.Idle, new IdleState(this));
        // states.Add(StateType.Patrol, new PatrolState(this));
        // states.Add(StateType.Chase, new ChaseState(this));
        // states.Add(StateType.React, new ReactState(this));
        // states.Add(StateType.Attack, new AttackState(this));
        // states.Add(StateType.Hit, new HitState(this));
        // states.Add(StateType.Death, new DeathState(this));
    }

    protected virtual void OnEnable()
    {
        parameter.animator = transform.GetComponent<Animator>();  // 获取角色上的动画控制器组件
        TransitionState(StateType.Idle);    // 初始状态为Idle
        currentState.OnEnter();
    }

    void Update()
    {
        parameter.animatorStateInfo = parameter.animator.GetCurrentAnimatorStateInfo(0);// 获取当前动画状态信息

        currentState.OnUpdate();    // 每帧更新当前状态

        //TODO:用于测试 如果按下回车键，设置被击中状态为true
        if (Input.GetKeyDown(KeyCode.Return))
        {
            parameter.getHit = true;
        }
    }


    void FixedUpdate()
    {
        currentState.OnFixedUpdate();
    }

    // 状态转换方法
    public void TransitionState(StateType type)
    {
        if (currentState != null)
            currentState.OnExit();  // 如果当前状态不为空，调用退出方法

        currentState = states[type];    // 更新当前状态为指定类型的状态
        currentState.OnEnter();         // 调用新状态的进入方法
    }

    // 翻转角色朝向方法，使其朝向目标
    public void FlipTo(Transform target)
    {
        if (target != null)
        {
            if (transform.position.x > target.position.x)
            {
                transform.localScale = new Vector3(-1, 1, 1);    // 如果角色在目标左侧，翻转角色朝向为左
            }
            else if (transform.position.x < target.position.x)
            {
                transform.localScale = new Vector3(1, 1, 1);     // 如果角色在目标右侧，翻转角色朝向为右
            }
        }
    }

    public void Destroy(){
        Destroy(gameObject);
    }

    // 触发器进入事件，检测到玩家时设置目标为玩家
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            parameter.target = other.transform;
        }
    }

    // 触发器离开事件，玩家离开时清空目标
    private void OnTriggerExit2D(Collider2D other)
    {
        if (other.CompareTag("Player"))
        {
            parameter.target = null;
        }
    }

    // 在Scene视图中绘制攻击范围的辅助图形
    private void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(parameter.attackPoint.position, parameter.attackArea);
    }
}
